Devinに既存IaCコードのセキュリティ対応を頼んでみた〜入門タスク編〜
はじめに
Devin調査シリーズの2回目です。本稿はDevinにどんなことなら頼めるのか、どんなことが難しいかを探っていきます。実際にありそうな業務を頼んでみて検証します。
今回はCDKのセキュリティ状況をチェックするcdk-nagを使用します。既存のCDKアプリにcdk-nagを実行した後、検出されたエラーを修正するためのPRを作成してもらいます。
今回のソース
以下のソースの内部管理版をベースに検証します。ほぼ同じ内容なので、細かい部分気になった際はこちらチェックしてください。
問題を選んだ背景
この部分はDevinに如何にタスクを渡すべきか考えた際の思考過程について書いています。どんな動きをするのかだけ気になる場合は飛ばしてください。
Devinは最初のブログにもあるように、3時間以上かかるタスクを分割した場合に良い結果を出すと書かれています。まずは最初の検証として、タスク分割は人間が実施して細かく分割したタスクをDevinに実施してもらいます。
ただ闇雲に細かいタスクを依頼しても評価が難しいので、生成AIにお願いしたいことを考えてみました。
個人的には出来れば新しいコード実装するようなクリエイティブな作業は人間とGenAIが共創して実施して、人間がある程度答えを把握できているが少し面倒なタスクをAIエージェントが勝手に処理してくれるのが理想的な状態かと思っています。今回はそんなタスクとしてセキュリティチェックを対象に考えました。
セキュリティチェックは大事な仕事ですが、中々現場によっては優先度が上がらなく対処出来ていない場合もありそうです。ここをうまくAIエージェントにお願いできないかなと考えました。ただよくあるExcelセキュリティチェックリストと実態の突き合わせをいきなり新人のDevinに頼むのは難しいかと考えたので、今回はコード上で結果が完結する方法を使います。具体的にはcdk-nagを使って問題を検出し、特定の検出結果に対応することをDevinにお願いすることにしました。
なので構造として、以下のようにタスク分解を今回はこちらで考えて実施します。
IaCのセキュリティ対応を必須とする→問題をcdk-nagによって検出する→検出結果に対応してコード修正(ここをDevinに依頼)
Devinに与える環境について
まだ自分がDevinに慣れていないので、いきなりAWSアカウントの認証情報を与えるのは懸念がありました。なので、今回はローカル環境で作業を完結させ、CIによるローカルテストのみ実行できれば問題なしとしました。何個かタスクが終わった段階で、最終的に人間がデプロイして問題なくデプロイ出来ることを確認します。
今回はDevinに対してAWS環境へのアクセスを制限して試しているため、今後どのようにDevinに権限を渡すのが良いか、どう問題が起きないようにサンドボックスを作れるのかは後続の記事で別に考えていきます。
Devinへの依頼
まずはcdk-nagを実行してもらってどんな結果が出るのか確認してもらいます。cdk-nagのパッケージもまだ導入していないので入れて試してもらいます。
すると数分後、Slack上でDevinから返答が来ます。
検出結果(文字で抽出したもの)
cdk-nagの実行結果、以下のセキュリティ関連の問題が検出されました:
IAMポリシーの問題:
- GitHubActionsのデプロイポリシーにワイルドカードパーミッション(s3:List*, arn:aws:s3:::*)が含まれています
- Lambda実行ロールがAWSマネージドポリシーを使用しています
- 複数のIAMロールでワイルドカードパーミッションが使用されています
SNSトピックの問題:
- AlertNotificationTopicでサーバーサイド暗号化が有効になっていません
- パブリッシャーにSSLの使用を要求していません
DynamoDBの問題:
- CompaniesTableでポイントインタイムリカバリが有効になっていません
Cognitoの問題:
- ユーザープールのパスワードポリシーが最小要件(長さ8文字以上、大文字、数字、特殊文字を含む)を満たしていません
- MFAが必須設定になっていません
- AdvancedSecurityModeがENFORCEDに設定されていません
API Gatewayの問題:
- RESTAPIでリクエストバリデーションが有効になっていません
- アクセスログが有効になっていません
- CloudWatchログが全メソッドで有効になっていません
- 一部のAPIメソッドで認証が実装されていません
- CognitoユーザープールオーソライザーがAPIメソッドで使用されていません
これらの問題は、AWSのセキュリティベストプラクティスに基づいて検出されたものです。
cdk-nagの内容と照らし合わせると妥当な内容を検出できてそうです。なので、Devin単体でもパッケージの導入指示とコードにcdk-nagを導入してcdk synth
などで検出結果を出すところまでは特に指示しなくても勝手にやってくれました。
今回は問題を小さく切って渡すことを重視するため以下の問題をピックアップして対処してもらいます。大体変更箇所は1~5行前後の内容です。
DynamoDBの問題:
- CompaniesTableでポイントインタイムリカバリが有効になっていません
Cognitoの問題:
- ユーザープールのパスワードポリシーが最小要件(長さ8文字以上、大文字、数字、特殊文字を含む)を満たしていません
余談ですが、タスク実行まではSLEEPでDevinには待ってもらって、数日後に実行しましたがコンテキストは覚えてくれていました。セッション内だとある程度記録は残るみたいです。
タスク1:DynamoDBのテーブルのポイントインタイムリカバリを有効化
DynamoDBのポイントインタイムリカバリーが指定されていないので、偶発的なデータ損失に対処するため有効化します。以下のように指示してみます。
また数分待つと以下のようにPRを作成したというコメントをくれます。
PRを開くと英語だったのでSlackで「PRを日本語で書いて」と頼むとまた数分後日本語で以下のように作成してくれます。
ただCDKのスナップショットテストが更新されていなくCIがエラーになっていたので、指摘し再度PUSHを頼みました。するとすぐに修正してPUSHしてくれました。ここでは特にスナップショットの更新コマンドなどは指定していないのですが、Devinが自分で考えて実行してくれました。
実はコードの修正箇所自体は以下のように実装が1行でかなり少ないですがうまくできました。
ただオンボーディングとしては簡単なタスクでまず成功体験を積むのが大事なので良かったかなと思います。特に問題ないため自分の方でマージしました。
ここまで自分はSlackでコメントしかしていないので、このブログの前半を部分を書きながらお願いしてました。手放しで依頼できる体験はかなり面白かったです。
タスク2:Cognitoのパスワードポリシー変更
次にCognitoのポリシー更新を試してみます。同じようにSlackで依頼してみます。
日本語で指示だししても突然英語が出てくるので、日本語でお願いしました。すぐに翻訳して提案してくれるので助かります。
問題ないのでタスクをそのままお願いしました。数分後にまたPRを作成してもらえたのですが、またスナップショットテストの更新が漏れていてエラーになったので指摘して再修正を依頼します。
後冗長なコメントがあったので、GitHub上のコメントで修正を依頼すると、Devinがすぐに👀リアクションで反応して対処してくれました。
最終的に以下のようなコードが生成され、自分からの依頼通りの内容のため自分の方でマージしました。
かかった費用
DevinではUsage & Limit
でセッションごとにかかったACUを確認できます。今回は以下のように5.71ACUかかりました。500ドルを超過するまでは1ACUが2ドルなので、約10ドルで1500円前後です。
ただのツールと思うと高く感じるかもしれませんが、人に頼むコストを考えるとかなり下がるように感じます。
所感
大枠の目的からかなり単純なタスクに切り分けるまで人間が行った場合にうまくいくのかを確認してみました。今回のコード修正は5行前後程度でしたが、指摘箇所がたくさんあると対処が大変なのでDevinにやってもらえるとありがたいです。
もっと自動化するならCDKのInteg Testを作って、権限付与を行えばいけそうに見えました。なので、今後の記事でDevinにどこまで権限を与えるのか、権限の制限範囲をどうするのか考えてブログにしてみます。
また、結構細かいコマンドまでDevinに指示しなくてもスナップショットの更新やパッケージの導入もやってくれたので未来を感じます。タスクの粒度をどこまで雑に投げてもやってくれるのか確認していきます。